// 配置与后端 oneback 的交互，这里使用 axios 作为示例
// 该文件封装了项目中所有与后端API通信的基础配置
import axios from 'axios';
import { ElMessage } from 'element-plus';

// 创建一个 axios 实例，用于与后端 oneback 交互
const request = axios.create({
    baseURL: 'http://localhost:8080', // 后端 oneback API 基础地址
    timeout: 10000, // 请求超时时间，单位为毫秒 (延长至10秒)
});

// 请求拦截器
// 作用：统一添加请求头，如Content-Type、认证token等
request.interceptors.request.use(
    config => {
        // 设置默认请求头为JSON格式
        config.headers['Content-Type'] = 'application/json;charset=UTF-8';
        // 此处可添加认证token: config.headers['Authorization'] = `Bearer ${token}`
        return config;
    },
    error => {
        console.error('请求拦截器出错:', error);
        // 后端不可用时返回空数据，避免阻塞前端渲染
        return Promise.resolve({ data: [] });
    }
);

// 响应拦截器
// 作用：统一处理响应数据和错误状态
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 业务逻辑错误处理（非200状态码）
        if (res.code && res.code != 200) {
            ElMessage.error(res.msg);
            return Promise.reject(res.msg);
        } else {
            return response.data;
        }
    },
    error => {
        // 处理超时重试逻辑
        const config = error.config;
        if (error.code === 'ECONNABORTED' && config && !config.__isRetryRequest) {
            config.__isRetryRequest = true;
            config.retryCount = config.retryCount || 0;
            if (config.retryCount < 3) {
                config.retryCount++;
                const delay = config.retryCount * 1000; // 指数退避策略
                return new Promise(resolve => {
                    setTimeout(() => {
                        resolve(request(config));
                    }, delay);
                });
            }
        }

        // 检查 error.response 是否存在，避免出现 Cannot read properties of undefined (reading 'status') 错误
        if (error.response) {
            const status = error.response.status;
            if(status === 404) {
                ElMessage.error('请求资源不存在');
            } else if(status === 500) {
                ElMessage.error('服务器内部错误');
            }else if(status === 400) {
                ElMessage.error('请求参数错误');
            }else if(status === 401) {
                ElMessage.error('未授权，请登录');
            }else{
                console.error('响应拦截器出错:', error);
            }
        } else {
            if (error.code === 'ECONNABORTED') {
                ElMessage.error('请求超时，请稍后重试');
            } else {
                console.error('响应拦截器出错: 没有响应对象', error);
            }
        }
        return Promise.reject(error);
    }
);

export default request;
